package progress.exa32_1.metaAnnotations.repeatable;

import java.lang.annotation.*;

/**
 * 注解类型 Repeatable 用于指明它作为元注解所声明的注解类型是可重复的.
 * 也就是用 @Repeatable 声明的注解 A, 可以作为容器注解, A 保证了被其注解的注解可以重复使用.
 */
public class RepeatableStudy {

    /**
     * 定义容器注解
     */
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    private @interface Container {
        //这里存储注解Element的参数组
        Element[] value();
    }

    /**
     * 定义可复用注解并指向容器注解
     */
    @Repeatable(Container.class)
    private @interface Element {
        String value() default "";
    }

    /**
     * 这里的可复用注解的注解信息会被注解Container接收
     * 我们可以通过得到Container信息来获取这里的注解信息
     */
    @Element("开始")
    @Element("准备")
    @Element("出发")
    @Element("到达目的地")
    private class Running {

    }

    public static void main(String[] args) {
        //判断Running是否存储了Container注解信息
        if(Running.class.isAnnotationPresent(Container.class)) {
            Container c = Running.class.getAnnotation(Container.class);
            System.out.println("Running's Element:");
            //遍历实际的Element注解中的信息
            for(Element e: c.value()){
                System.out.println(e.value());
            }
        }
    }
}
